<?php

namespace Api\Member\ApiPass\Open;

use Api\RepositoryResourceTrait;
use GuzzleHttp\Client;


/**
 * 资源仓库
 */
class ApiPassRepository
{
    use RepositoryResourceTrait;

    public function __construct() {
        $this->key = ['key' => '82d5cf37e5cfe89fc8e2f827bd1f4552'];
        $this->config = [
            'commitApi' => 'https://akpays.com/api/draw/commit',   // 提款接口地址
            'queryApi'  => 'https://akpays.com/api/draw/query',    // 提款结果查询接口地址
        ];
    }

    /**
     * 输入的变量验证
     *
     * @return void
     */
    public function judgment($account, $business, $businessBank, $businessCard, $businessDescription, $businessPhone, $money, $notifyUrl, $reverseUrl, $shOrderId)
    {
        if (empty($account)) {
            throw_exception('Member\ApiPass', 'validation_fail', '商户号不能为空');
        }

        if (empty($business)) {
            throw_exception('Member\ApiPass', 'validation_fail', '收款人姓名不能为空');
        }

        if (empty($businessBank)) {
            throw_exception('Member\ApiPass', 'validation_fail', '收款银行名称不能为空');
        }
        
        if (empty($businessCard)) {
            throw_exception('Member\ApiPass', 'validation_fail', '银行卡号不能为空');
        }

        if (empty($businessDescription)) {
            throw_exception('Member\ApiPass', 'validation_fail', '附言不能为空');
        }

        if (empty($businessPhone)) {
            throw_exception('Member\ApiPass', 'validation_fail', '收款通知手机号不能为空');
        }

        if (empty($money)) {
            throw_exception('Member\ApiPass', 'validation_fail', '提款金额（单位：元）不能为空');
        }

        if (empty($notifyUrl)) {
            throw_exception('Member\ApiPass', 'validation_fail', '提款结果通知地址不能为空');
        }

        if (empty($reverseUrl)) {
            throw_exception('Member\ApiPass', 'validation_fail', '冲正回调地址不能为空');
        }

        if (empty($shOrderId)) {
            throw_exception('Member\ApiPass', 'validation_fail', '商户订单号不能为空');
        }

        // $shOrderId = '/^([0x]{2})+[a-f0-9]{40}$/';
        // if (preg_match($pattern, $imtokenWalletAddress) === 0) {
        //     throw_exception('Member\ApiPass', 'validation_fail', trans('authPerson.imtokenWalletFormatFailed'));
        // }
    }

    /**
     * 提款接口
     *
     * @return void
     */
    public function commit($account, $business, $businessBank, $businessCard, $businessDescription, $businessPhone, $money, $notifyUrl, $reverseUrl, $shOrderId)
    {
        // 获取数据
        $json = [
            'account'               => $account,                                // 商户号
            'business'              => $business,                               // 收款人姓名
            'businessBank'          => $businessBank,                           // 收款银行名称
            'businessCard'          => $businessCard,                           // 银行卡号
            'businessDescription'   => $businessDescription,                    // 附言
            'businessPhone'         => $businessPhone,                          // 收款通知手机号
            'money'                 => $money,                                  // 提款金额（单位：元）
            'notifyUrl'             => $notifyUrl,                              // 提款结果通知地址
            'reverseUrl'            => $reverseUrl,                             // 冲正回调地址
            'shOrderId'             => $shOrderId,                              // 商户订单号 
        ];

        // 签名数据拼装
        $data = array_merge($json, $this->key);
        // 获取签名
        $sign = ['sign' => $this->getSign($data)];

        // 请求数据拼装
        $json = array_merge($json,$sign);
        
        // 请求提款接口
		$client     = new Client();
        $response   = $client->request('POST', $this->config['commitApi'], compact('json'));
        $result     = json_decode($response->getBody());

        return $result;
    }

    /**
     * 提款结果查询接口地址
     *
     * @param [type] $account 商户号
     * @param [type] $orderId 订单号
     * @param [type] $shOrderId 商户订单号
     * @param [type] $sign 签名
     * @return void
     */
    public function query($account, $orderId, $shOrderId, $sign)
    {
        $json = [
            'account'   => $account,
            'orderId'   => $orderId,
            'shOrderId' => $shOrderId,
            'sign'      => $sign,
        ];

        // 商户编号
        $key = ['key' => '82d5cf37e5cfe89fc8e2f827bd1f4552'];
        
        // 签名数据拼装
        $data = array_merge($json,$key);
        $sign = ['sign' => $this->getSign($data)];

        // 请求数据拼装
        $json = array_merge($json,$sign);

        // 请求查询接口
		$client     = new Client();
        $response   = $client->request('POST', $this->config['queryApi'], compact('json'));
        $result     = json_decode($response->getBody());


        return $result;
    }
    
    /**
     * 提款结果通知
     *
     * @return void
     */
    public function callBack()
    {
        $data = $_REQUEST;
        $data['account'];               // 回调的商户号
        $data['business'];              // 收款人姓名
        $data['businessBank'];          // 收款银行名称
        $data['businessCard'];          // 银行卡号
        $data['businessDescription'];   // 附言
        $data['businessPhone'];         // 收款通知手机号
        $data['endTime'];               // 提款完成时间（毫秒时间戳）
        $data['machineId'];             // 设备号
        $data['money'];                 // 提款金额（单位：元）
        $data['orderId'];               // 订单号
        $data['serviceMoney'];          // 手续费（单位：元）
        $data['shOrderId'];             // 商户订单号
        $data['sign'];                  // 签名 
        $data['startTime'];             // 提款开始时间（毫秒时间戳） 
        $data['state'];                 // 提款状态（0 待处理，1 处理中，2 关闭，3 待确认，4 失败，5 成功） 
        $data['type'];                  // 交易类型（1 提款2 冲正） 
    }

    /**
     * 冲正回调通知
     *
     * @return void
     */
    public function reverse()
    {

    }


    // 以下为通用函数可放在助手函数库

    /**
     * 签名
     * 
     * @param [Array] $data 待签名数组
     * @return void
     */
    public function getSign($data)
    {
        $query_str = $this->http_url_str($data);
        $result    = md5($query_str);
        $result    = mb_convert_case($result, MB_CASE_UPPER, "UTF-8");
        return $result;
    }
    
    /**
     * 数组参数转换URL (http_build_query)
     *
     * @param [Array] $param 待转换数组
     * @return void
     */
    function http_url_str($param)
    {
        $tmp = [];
        foreach ($param as $key => $value) {
            $tmp[] = "$key=$value";
        }
        return implode('&', $tmp);
    }

}
